<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Function pointer</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Function_pointer"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Function_pointer rootpage-Function_pointer skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Function pointer</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<p>
A <b>function pointer</b>, also called a <b>subroutine pointer</b> or <b>procedure pointer</b>, is a <a href="Pointer_(computer_programming)" title="Pointer (computer programming)">pointer</a> referencing executable code, rather than data. <a href="Dereference_operator" class="mw-redirect" title="Dereference operator">Dereferencing</a> the function pointer yields the referenced <a href="Subroutine" class="mw-redirect" title="Subroutine">function</a>, which can be invoked and passed arguments just as in a normal function call. Such an invocation is also known as an "indirect" call, because the function is being invoked <i>indirectly</i> through a variable instead of <i>directly</i> through a fixed identifier or address.
</p><p>Function pointers allow different code to be executed at runtime. They can also be passed to a function to enable <a href="Callback_(computer_programming)" title="Callback (computer programming)">callbacks</a>.
</p><p>Function pointers are supported by <a href="Third-generation_programming_language" title="Third-generation programming language">third-generation</a> <a href="Programming_language" title="Programming language">programming languages</a> (such as <a href="PL/I" title="PL/I">PL/I</a>, <a href="COBOL" title="COBOL">COBOL</a>, <a href="Fortran" title="Fortran">Fortran</a>,<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> <a href="DBASE" class="mw-redirect" title="DBASE">dBASE</a> dBL, and <a href="C_(programming_language)" title="C (programming language)">C</a>) and <a href="Object-oriented_programming" title="Object-oriented programming">object-oriented programming</a> languages (such as <a href="C%2B%2B" title="C++">C++</a>, <a href="C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a>, and <a href="D_(programming_language)" title="D (programming language)">D</a>).<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Simple_function_pointers">Simple function pointers</h2></div>
<p>The simplest implementation of a function (or subroutine) pointer is as a <a href="Variable_(computer_science)" title="Variable (computer science)">variable</a> containing the <a href="Memory_address" title="Memory address">address</a> of the function within executable memory. Older <a href="Third-generation_programming_language" title="Third-generation programming language">third-generation languages</a> such as <a href="PL/I" title="PL/I">PL/I</a> and <a href="COBOL" title="COBOL">COBOL</a>, as well as more modern languages such as <a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a> and <a href="C_(programming_language)" title="C (programming language)">C</a> generally implement function pointers in this manner.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Example_in_C">Example in C</h3></div>
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">See also: <a href="#Alternate_C_and_C++_syntax">§ Alternate C and C++ syntax</a></div>
<p>The following C program illustrates the use of two function pointers:
</p>
<ul><li><i>func1</i> takes one double-precision (double) parameter and returns another double, and is assigned to a function which converts centimeters to inches.</li>
<li><i>func2</i> takes a pointer to a constant character array as well as an integer and returns a pointer to a character, and is assigned to a <a href="C_string_handling" title="C string handling">C string handling</a> function which returns a pointer to the first occurrence of a given character in a character array.</li></ul>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span><span class="c1"> /* for printf */</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><string.h></span><span class="c1"> /* for strchr */</span>
<span class="kt">double</span><span class="w"> </span><span class="nf">cm_to_inches</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">cm</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">cm</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">2.54</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// "strchr" is part of the C string handling (i.e., no need for declaration)</span>
<span class="c1">// See https://en.wikipedia.org/wiki/C_string_handling#Functions</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">func1</span><span class="p">)(</span><span class="kt">double</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cm_to_inches</span><span class="p">;</span>
<span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">func2</span><span class="p">)(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">strchr</span><span class="p">;</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"%f %s"</span><span class="p">,</span><span class="w"> </span><span class="n">func1</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span><span class="w"> </span><span class="n">func2</span><span class="p">(</span><span class="s">"Wikipedia"</span><span class="p">,</span><span class="w"> </span><span class="sc">'p'</span><span class="p">));</span>
<span class="w"> </span><span class="cm">/* prints "5.905512 pedia" */</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>The next program uses a function pointer to invoke one of two functions (<code>sin</code> or <code>cos</code>) indirectly from another function (<code>compute_sum</code>, computing an approximation of the function's <a href="Riemann_integration" class="mw-redirect" title="Riemann integration">Riemann integration</a>). The program operates by having function <code>main</code> call function <code>compute_sum</code> twice, passing it a pointer to the library function <code>sin</code> the first time, and a pointer to function <code>cos</code> the second time. Function <code>compute_sum</code> in turn invokes one of the two functions indirectly by dereferencing its function pointer argument <code>funcp</code> multiple times, adding together the values that the invoked function returns and returning the resulting sum. The two sums are written to the standard output by <code>main</code>.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><math.h></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span>
<span class="c1">// Function taking a function pointer as an argument</span>
<span class="kt">double</span><span class="w"> </span><span class="nf">compute_sum</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">funcp</span><span class="p">)(</span><span class="kt">double</span><span class="p">),</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">lo</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">hi</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0.0</span><span class="p">;</span>
<span class="w"> </span><span class="c1">// Add values returned by the pointed-to function '*funcp'</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Use the function pointer 'funcp' to invoke the function</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">100.0</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="n">hi</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">lo</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">lo</span><span class="p">;</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">funcp</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
<span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">y</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">101.0</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="n">hi</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">lo</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">double</span><span class="w"> </span><span class="nf">square</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">x</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">sum</span><span class="p">;</span>
<span class="w"> </span><span class="c1">// Use standard library function 'sin()' as the pointed-to function</span>
<span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">compute_sum</span><span class="p">(</span><span class="n">sin</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">);</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"sum(sin): %g</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">sum</span><span class="p">);</span>
<span class="w"> </span><span class="c1">// Use standard library function 'cos()' as the pointed-to function</span>
<span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">compute_sum</span><span class="p">(</span><span class="n">cos</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">);</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"sum(cos): %g</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">sum</span><span class="p">);</span>
<span class="w"> </span><span class="c1">// Use user-defined function 'square()' as the pointed-to function</span>
<span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">compute_sum</span><span class="p">(</span><span class="n">square</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">,</span><span class="w"> </span><span class="mf">1.0</span><span class="p">);</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"sum(square): %g</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">sum</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Functors">Functors</h2></div>
<div role="note" class="hatnote navigation-not-searchable">Main article: <a href="Function_object" title="Function object">Function object</a></div>
<p>Functors, or function objects, are similar to function pointers, and can be used in similar ways. A functor is an object of a class type that implements the <a href="Function-call_operator" class="mw-redirect" title="Function-call operator">function-call operator</a>, allowing the object to be used within expressions using the same syntax as a function call. Functors are more powerful than simple function pointers, being able to contain their own data values, and allowing the programmer to emulate <a href="Closure_(computer_programming)" title="Closure (computer programming)">closures</a>. They are also used as callback functions if it is necessary to use a member function as a callback function.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p><p>Many "pure" object-oriented languages do not <a href="Support_function" title="Support function">support function</a> pointers. Something similar can be implemented in these kinds of languages, though, using <a href="Reference_(computer_science)" title="Reference (computer science)">references</a> to <a href="Protocol_(object-oriented_programming)" class="mw-redirect" title="Protocol (object-oriented programming)">interfaces</a> that define a single <a href="Method_(computer_programming)" title="Method (computer programming)">method</a> (member function). <a href="List_of_CLI_languages" title="List of CLI languages">CLI languages</a> such as <a href="C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a> and <a href="Visual_Basic_.NET" class="mw-redirect" title="Visual Basic .NET">Visual Basic .NET</a> implement <a href="Type_safety" title="Type safety">type-safe</a> function pointers with <a href="Delegate_(CLI)" title="Delegate (CLI)">delegates</a>.
</p><p>In other languages that support <a href="First-class_function" title="First-class function">first-class functions</a>, functions are regarded as data, and can be passed, returned, and created dynamically directly by other functions, eliminating the need for function pointers.
</p><p>Extensively using function pointers to call functions may produce a slow-down for the code on modern processors, because a <a href="Branch_predictor" title="Branch predictor">branch predictor</a> may not be able to figure out where to branch to (it depends on the value of the function pointer at run time) although this effect can be overstated as it is often amply compensated for by significantly reduced non-indexed table lookups.
</p>
<div class="mw-heading mw-heading2"><h2 id="Method_pointers">Method pointers</h2></div>
<p>C++ includes support for <a href="Object-oriented_programming" title="Object-oriented programming">object-oriented programming</a>, so classes can have <a href="Method_(computer_programming)" title="Method (computer programming)">methods</a> (usually referred to as member functions). Non-static member functions (instance methods) have an implicit parameter (the <i><a href="This_(computer_programming)" title="This (computer programming)">this</a></i> pointer) which is the pointer to the object it is operating on, so the type of the object must be included as part of the type of the function pointer. The method is then used on an object of that class by using one of the "pointer-to-member" operators: <code>.*</code> or <code>->*</code> (for an object or a pointer to object, respectively).
</p><p>Although function pointers in C and C++ can be implemented as simple addresses, so that typically <code>sizeof(Fx)==sizeof(void *)</code>, member pointers in C++ are sometimes implemented as "<a href="Fat_pointer" class="mw-redirect" title="Fat pointer">fat pointers</a>", typically two or three times the size of a simple function pointer, in order to deal with <a href="Virtual_methods" class="mw-redirect" title="Virtual methods">virtual methods</a> and <a href="Virtual_inheritance" title="Virtual inheritance">virtual inheritance</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="In_C++">In C++</h2></div>
<p>In C++, in addition to the method used in C, it is also possible to use the <a href="C%2B%2B_Standard_Library" title="C++ Standard Library">C++ standard library</a> class template <style data-mw-deduplicate="TemplateStyles:r886049734">
/* start https://en.wikipedia.org/ */
.mw-parser-output .monospaced{font-family:monospace,monospace}
/* end https://en.wikipedia.org/ */
</style><span class="monospaced">std::function</span>, of which the instances are function objects:
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><iostream></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><functional></span>
<span class="k">using</span><span class="w"> </span><span class="k">namespace</span><span class="w"> </span><span class="nn">std</span><span class="p">;</span>
<span class="k">static</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">derivative</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">function</span><span class="o"><</span><span class="kt">double</span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="o">></span><span class="w"> </span><span class="o">&</span><span class="n">f</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">x0</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">eps</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">eps2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">eps</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">lo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x0</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">eps2</span><span class="p">;</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">hi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">eps2</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="n">hi</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">f</span><span class="p">(</span><span class="n">lo</span><span class="p">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">eps</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">f</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">x</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"d/dx(x ^ 2) [@ x = "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"] = "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">derivative</span><span class="p">(</span><span class="n">f</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="mf">1e-5</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Pointers_to_member_functions_in_C++">Pointers to member functions in C++</h3></div>
<div role="note" class="hatnote navigation-not-searchable">See also: <a href="#Alternate_C_and_C++_syntax">§ Alternate C and C++ syntax</a></div>
<p>This is how C++ uses function pointers when dealing with member functions of classes or structs. These are invoked using an object pointer or a this call. They are type safe in that you can only call members of that class (or derivatives) using a pointer of that type. This example also demonstrates the use of a typedef for the pointer to member function added for simplicity. Function pointers to static member functions are done in the traditional 'C' style because there is no object pointer for this call required.
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><iostream></span>
<span class="k">using</span><span class="w"> </span><span class="k">namespace</span><span class="w"> </span><span class="nn">std</span><span class="p">;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Foo</span><span class="w"> </span><span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">add</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">i</span><span class="o">+</span><span class="n">j</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">mult</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">i</span><span class="o">*</span><span class="n">j</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">negate</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">-</span><span class="n">i</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">};</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">bar1</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="p">,</span><span class="w"> </span><span class="n">Foo</span><span class="o">*</span><span class="w"> </span><span class="n">pFoo</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">(</span><span class="n">Foo</span><span class="o">::*</span><span class="n">pfn</span><span class="p">)(</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">pFoo</span><span class="o">->*</span><span class="n">pfn</span><span class="p">)(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">typedef</span><span class="w"> </span><span class="kt">int</span><span class="p">(</span><span class="n">Foo</span><span class="o">::*</span><span class="n">Foo_pfn</span><span class="p">)(</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="p">);</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">bar2</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="p">,</span><span class="w"> </span><span class="n">Foo</span><span class="o">*</span><span class="w"> </span><span class="n">pFoo</span><span class="p">,</span><span class="w"> </span><span class="n">Foo_pfn</span><span class="w"> </span><span class="n">pfn</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">pFoo</span><span class="o">->*</span><span class="n">pfn</span><span class="p">)(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">typedef</span><span class="w"> </span><span class="k">auto</span><span class="p">(</span><span class="o">*</span><span class="n">PFN</span><span class="p">)(</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="kt">int</span><span class="p">;</span>
<span class="c1">// C++ only, same as: typedef int(*PFN)(int);</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">bar3</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">PFN</span><span class="w"> </span><span class="n">pfn</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pfn</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Foo</span><span class="w"> </span><span class="n">foo</span><span class="p">;</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Foo::add(2,4) = "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">bar1</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">foo</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">Foo</span><span class="o">::</span><span class="n">add</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Foo::mult(3,5) = "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">bar2</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">foo</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">Foo</span><span class="o">::</span><span class="n">mult</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Foo::negate(6) = "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">bar3</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">Foo</span><span class="o">::</span><span class="n">negate</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Alternate_C_and_C++_syntax">Alternate C and C++ syntax</h2></div>
<p>The C and <a href="C%2B%2B_syntax" title="C++ syntax">C++ syntax</a> given above is the canonical one used in all the textbooks - but it's difficult to read and explain. Even the above <code>typedef</code> examples use this syntax. However, every C and C++ compiler supports a more clear and concise mechanism to declare function pointers: use <code>typedef</code>, but <i>don't</i> store the pointer as part of the definition. Note that the only way this kind of <code>typedef</code> can actually be used is with a pointer - but that highlights the pointer-ness of it.
</p>
<div class="mw-heading mw-heading3"><h3 id="C_and_C++">C and C++</h3></div>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="c1">// This declares 'F', a function that accepts a 'char' and returns an 'int'. Definition is elsewhere.</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">F</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">);</span>
<span class="c1">// This defines 'Fn', a type of function that accepts a 'char' and returns an 'int'.</span>
<span class="k">typedef</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">Fn</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">);</span>
<span class="c1">// This defines 'fn', a variable of type pointer-to-'Fn', and assigns the address of 'F' to it.</span>
<span class="n">Fn</span><span class="w"> </span><span class="o">*</span><span class="n">fn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">F</span><span class="p">;</span><span class="w"> </span><span class="c1">// Note '&' not required - but it highlights what is being done.</span>
<span class="c1">// This calls 'F' using 'fn', assigning the result to the variable 'a'</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fn</span><span class="p">(</span><span class="sc">'A'</span><span class="p">);</span>
<span class="c1">// This defines 'Call', a function that accepts a pointer-to-'Fn', calls it, and returns the result</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">Call</span><span class="p">(</span><span class="n">Fn</span><span class="w"> </span><span class="o">*</span><span class="n">fn</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">fn</span><span class="p">(</span><span class="n">c</span><span class="p">);</span>
<span class="p">}</span><span class="w"> </span><span class="c1">// Call(fn, c)</span>
<span class="c1">// This calls function 'Call', passing in 'F' and assigning the result to 'call'</span>
<span class="kt">int</span><span class="w"> </span><span class="n">call</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Call</span><span class="p">(</span><span class="o">&</span><span class="n">F</span><span class="p">,</span><span class="w"> </span><span class="sc">'A'</span><span class="p">);</span><span class="w"> </span><span class="c1">// Again, '&' is not required</span>
<span class="c1">// LEGACY: Note that to maintain existing code bases, the above definition style can still be used first;</span>
<span class="c1">// then the original type can be defined in terms of it using the new style.</span>
<span class="c1">// This defines 'PFn', a type of pointer-to-type-Fn.</span>
<span class="k">typedef</span><span class="w"> </span><span class="n">Fn</span><span class="w"> </span><span class="o">*</span><span class="n">PFn</span><span class="p">;</span>
<span class="c1">// 'PFn' can be used wherever 'Fn *' can</span>
<span class="n">PFn</span><span class="w"> </span><span class="n">pfn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">F</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">CallP</span><span class="p">(</span><span class="n">PFn</span><span class="w"> </span><span class="n">fn</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">);</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="C++">C++</h3></div>
<p>These examples use the above definitions. In particular, note that the above definition for <code>Fn</code> can be used in pointer-to-member-function definitions:
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="c1">// This defines 'C', a class with similar static and member functions,</span>
<span class="c1">// and then creates an instance called 'c'</span>
<span class="k">class</span><span class="w"> </span><span class="nc">C</span><span class="w"> </span><span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">Static</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">);</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">Member</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">);</span>
<span class="p">}</span><span class="w"> </span><span class="n">c</span><span class="p">;</span><span class="w"> </span><span class="c1">// C</span>
<span class="c1">// This defines 'p', a pointer to 'C' and assigns the address of 'c' to it</span>
<span class="n">C</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">c</span><span class="p">;</span>
<span class="c1">// This assigns a pointer-to-'Static' to 'fn'.</span>
<span class="c1">// Since there is no 'this', 'Fn' is the correct type; and 'fn' can be used as above.</span>
<span class="n">fn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">C</span><span class="o">::</span><span class="n">Static</span><span class="p">;</span>
<span class="c1">// This defines 'm', a pointer-to-member-of-'C' with type 'Fn',</span>
<span class="c1">// and assigns the address of 'C::Member' to it.</span>
<span class="c1">// You can read it right-to-left like all pointers:</span>
<span class="c1">// "'m' is a pointer to member of class 'C' of type 'Fn'"</span>
<span class="n">Fn</span><span class="w"> </span><span class="n">C</span><span class="o">::*</span><span class="n">m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">C</span><span class="o">::</span><span class="n">Member</span><span class="p">;</span>
<span class="c1">// This uses 'm' to call 'Member' in 'c', assigning the result to 'cA'</span>
<span class="kt">int</span><span class="w"> </span><span class="n">cA</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="p">.</span><span class="o">*</span><span class="n">m</span><span class="p">)(</span><span class="sc">'A'</span><span class="p">);</span>
<span class="c1">// This uses 'm' to call 'Member' in 'p', assigning the result to 'pA'</span>
<span class="kt">int</span><span class="w"> </span><span class="n">pA</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="o">->*</span><span class="n">m</span><span class="p">)(</span><span class="sc">'A'</span><span class="p">);</span>
<span class="c1">// This defines 'Ref', a function that accepts a reference-to-'C',</span>
<span class="c1">// a pointer-to-member-of-'C' of type 'Fn', and a 'char',</span>
<span class="c1">// calls the function and returns the result</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">Ref</span><span class="p">(</span><span class="n">C</span><span class="w"> </span><span class="o">&</span><span class="n">r</span><span class="p">,</span><span class="w"> </span><span class="n">Fn</span><span class="w"> </span><span class="n">C</span><span class="o">::*</span><span class="n">m</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">r</span><span class="p">.</span><span class="o">*</span><span class="n">m</span><span class="p">)(</span><span class="n">c</span><span class="p">);</span>
<span class="p">}</span><span class="w"> </span><span class="c1">// Ref(r, m, c)</span>
<span class="c1">// This defines 'Ptr', a function that accepts a pointer-to-'C',</span>
<span class="c1">// a pointer-to-member-of-'C' of type 'Fn', and a 'char',</span>
<span class="c1">// calls the function and returns the result</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">Ptr</span><span class="p">(</span><span class="n">C</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">Fn</span><span class="w"> </span><span class="n">C</span><span class="o">::*</span><span class="n">m</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="o">->*</span><span class="n">m</span><span class="p">)(</span><span class="n">c</span><span class="p">);</span>
<span class="p">}</span><span class="w"> </span><span class="c1">// Ptr(p, m, c)</span>
<span class="c1">// LEGACY: Note that to maintain existing code bases, the above definition style can still be used first;</span>
<span class="c1">// then the original type can be defined in terms of it using the new style.</span>
<span class="c1">// This defines 'FnC', a type of pointer-to-member-of-class-'C' of type 'Fn'</span>
<span class="k">typedef</span><span class="w"> </span><span class="n">Fn</span><span class="w"> </span><span class="n">C</span><span class="o">::*</span><span class="n">FnC</span><span class="p">;</span>
<span class="c1">// 'FnC' can be used wherever 'Fn C::*' can</span>
<span class="n">FnC</span><span class="w"> </span><span class="n">fnC</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">C</span><span class="o">::</span><span class="n">Member</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">RefP</span><span class="p">(</span><span class="n">C</span><span class="w"> </span><span class="o">&</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">FnC</span><span class="w"> </span><span class="n">m</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">c</span><span class="p">);</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="PL/I">PL/I</h2></div>
<p><a href="PL/I" title="PL/I">PL/I</a> procedures can be nested, that is, procedure A may contain procedure B, which in turn may contain C. In addition to data declared in B, B can also reference any data declared in A, as long as it doesn’t override the definition. Likewise C can reference data in both A and B. Therefore, PL/I ENTRY variables need to contain <i>context</i>,<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> to provide procedure C with the addresses of the values of data in B and A at the time C was called.
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Delegation_(computing)" title="Delegation (computing)">Delegation (computing)</a></li>
<li><a href="Function_object" title="Function object">Function object</a></li>
<li><a href="Higher-order_function" title="Higher-order function">Higher-order function</a></li>
<li><a href="Procedural_parameter" title="Procedural parameter">Procedural parameter</a></li>
<li><a href="Closure_(computer_programming)" title="Closure (computer programming)">Closure</a></li>
<li><a href="Anonymous_function" title="Anonymous function">Anonymous functions</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFAndrew_J._Miller" class="citation web cs1">Andrew J. Miller. <a rel="nofollow" class="external text" href="http://www.esm.psu.edu/~ajm138/fortranexamples.html#ex1">"Fortran Examples"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">2013-09-14</span></span>.</cite></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110516153643/http://www.newty.de/fpt/intro.html#what">"The Function Pointer Tutorials"</a>. logo. Archived from <a rel="nofollow" class="external text" href="http://www.newty.de/fpt/intro.html#what">the original</a> on 2011-05-16<span class="reference-accessdate">. Retrieved <span class="nowrap">2011-04-13</span></span>. <q>Function Pointers are pointers, i.e. variables, which point to the address of a function</q></cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110516153643/http://www.newty.de/fpt/intro.html#top">"The Function Pointer Tutorials"</a>. logo. Archived from <a rel="nofollow" class="external text" href="http://www.newty.de/fpt/intro.html#top">the original</a> on 2011-05-16<span class="reference-accessdate">. Retrieved <span class="nowrap">2011-04-13</span></span>. <q>Important note: A function pointer always points to a function with a specific signature! Thus all functions, you want to use with the same function pointer, must have the same parameters and return-type!</q></cite></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.devx.com/tips/Tip/27126">"Expertise: Intermediate Language: C++: Use Functor for Callbacks in C++"</a>. DevX.com. 2005-01-31<span class="reference-accessdate">. Retrieved <span class="nowrap">2011-04-13</span></span>. <q>If you want to use a member function as a callback function, then the member function needs to be associated with an object of the class before it can be called. In this case, you can use functor [with an example on this page].</q></cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><cite id="CITEREFAbrahams1978" class="citation book cs1">Abrahams, Paul (March 1978). <a rel="nofollow" class="external text" href="http://www.iron-spring.com/abrahams.pdf"><i>The PL/I Programming Language</i></a> <span class="cs1-format">(PDF)</span>. Courant Mathematics and Computing Laboratory, New York University. pp. <span class="nowrap">22–</span>24<span class="reference-accessdate">. Retrieved <span class="nowrap">April 4,</span> 2025</span>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20041013202445/http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.12">FAQ on Function Pointers</a>, things to avoid with function pointers, some information on using <a href="Function_object" title="Function object">function objects</a></li>
<li><a rel="nofollow" class="external text" href="http://www.newty.de/fpt/">Function Pointer Tutorials</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20180630152057/http://www.newty.de/fpt/">Archived</a> 2018-06-30 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a>, a guide to C/C++ function pointers, <a href="Callback_(computer_programming)" title="Callback (computer programming)">callbacks</a>, and <a href="Function_object" title="Function object">function objects</a> (functors)</li>
<li><a rel="nofollow" class="external text" href="http://www.codeproject.com/KB/cpp/FastDelegate.aspx">Member Function Pointers and the Fastest Possible C++ Delegates</a>, CodeProject article by Don Clugston</li>
<li><a rel="nofollow" class="external text" href="http://www.cplusplus.com/doc/tutorial/pointers.html">Pointer Tutorials</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20090405234937/http://www.cplusplus.com/doc/tutorial/pointers.html">Archived</a> 2009-04-05 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a>, C++ documentation and tutorials</li>
<li><a rel="nofollow" class="external text" href="http://www.onlinecomputerteacher.net/pointers-in-c.html">C pointers explained</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20190609120644/http://www.onlinecomputerteacher.net/pointers-in-c.html">Archived</a> 2019-06-09 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a> a visual guide of pointers in C</li>
<li><a rel="nofollow" class="external text" href="http://www.codeproject.com/KB/security/Securefunctionpointer.aspx">Secure Function Pointer and Callbacks in Windows Programming</a>, CodeProject article by R. Selvam</li>
<li><a rel="nofollow" class="external text" href="http://publications.gbdirect.co.uk/c_book/chapter5/function_pointers.html">The C Book</a>, Function Pointers in C by "The C Book"</li>
<li><a rel="nofollow" class="external text" href="http://www.dbase.com/help/2_80/Language_Definition/IDH_LDEF_FUNCPOINTERS.htm">Function Pointers in dBASE dBL</a>, Function Pointer in dBASE dBL</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-08-03" href="https://en.wikipedia.org/wiki/?title=Function_pointer&oldid=1304011439">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>